﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;

namespace _012_线程_委托方式发起进程
{
    class Program
    {
        static int Test(int i)
        {
            Console.WriteLine("123"+i);
            Thread.Sleep(100);
            return 100;
        }

        static void Main(string[] args)
        {
            //Func<int, int> a = Test;
            //开启一个新的线程去执行a所引用的方法
            //            IAsyncResult ar = a.BeginInvoke(15,null,null);
            //            Console.WriteLine("main");
            // 判断线程是否执行完
            //            while (ar.IsCompleted==false)//未执行完
            //            {
            //                Console.Write(".");
            //                Thread.Sleep(10);
            //            }
            //            //取得线程的返回结果
            //            int res = a.EndInvoke(ar);
            //            Console.WriteLine(res);


            // 等待句柄 必须等线程执行完才会继续往下执行，设置时间后，结束返回true，反之false
            //            bool isEnd = ar.AsyncWaitHandle.WaitOne(1000);
            //            if (isEnd)
            //            {
            //                //获取结果
            //                int res = a.EndInvoke(ar);
            //            }

            Func<int, int> a = Test;
            // 倒数第二个参数为回调  为一个方法，必须接受一个IAsyncResult类型的参数
            // 倒数第一个参数用来给回调函数传递参数
            IAsyncResult ar = a.BeginInvoke(100, OnCallBack,"laskdj");
            a.BeginInvoke(15, r =>
            {
                Console.WriteLine("子线程执行完毕");
                int res = a.EndInvoke(r);
                Console.WriteLine(res);
            },null);

            
            Console.ReadKey();
        }

        static void OnCallBack(IAsyncResult ar)
        {
            Func<int, int> tempa = ar.AsyncState as Func<int, int>;
            Console.WriteLine("子线程执行完毕");
            int res = tempa.EndInvoke(ar);
            Console.WriteLine(res);
        }
    }
}
